package com.zy.explore.db.infrastructure.plugins.multidbsupport.sqlchange.base;

/**
 * 建类说明：sql字符串工具类
 *
 * @author 中国印
 * @date 2022年02月16日 23:11:16
 */
public class SqlStringUtils {

    /**
     * 是否为空白字符
     */
    public static boolean isBlank(char c) {
        return c == ' ' || c == '\n' || c == '\r' || c == '\t';
    }


    /**
     * 获取sql块结束位置(暂时只考虑括号)
     * 从前往后查找查找
     *
     * @param str
     * @param startIdx
     * @param stopIdx
     * @return
     */
    public static int getSqlBlockAfterIdx(String str, int startIdx, int stopIdx) {
        //层级
        int layer = 0;
        for (int i = startIdx; i < stopIdx; i++) {
            char c = str.charAt(i);
            if (c == '(') {
                layer++;
            } else if (c == ')') {
                layer--;
            }
        }
        // 里面的括号块都是完整的
        if (layer == 0) {
            return -1;
        }
        //层级大于0，找到层级等于0位置
        int i = stopIdx;
        for (; i < str.length() && layer > 0; i++) {
            char c = str.charAt(i);
            if (c == '(') {
                layer++;
            } else if (c == ')') {
                layer--;
            }
        }
        return i;
    }


    /**
     * 获取sql块结束位置(暂时只考虑括号)
     */
    public static int getSqlBlockBeforeIdx(String str, int startIdx, int stopIdx) {
        // 层级
        int layer = 0;
        for (int i = stopIdx; i > startIdx; i--) {
            char c = str.charAt(i);
            if (c == ')') {
                layer++;
            } else if (c == '(') {
                layer--;
            }
        }
        //里面的括号块都是完整的
        if (layer == 0) {
            return -1;
        }
        //层级大于0，找到层级等于0位置
        int i = startIdx;
        for (; i >= 0 && layer > 0; i--) {
            char c = str.charAt(i);
            if (c == ')') {
                layer++;
            } else if (c == '(') {
                layer--;
            }
        }
        return i;
    }
}
